package requeteur.ejb.commun.dto;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

/**
 * @author Laurent
 * @version 0.1
 */
public class Champ {

	private String nom;
	private String type;
	private String valeurParDefaut;
	private String commentaire;
	private int position;
	private int taille;
	private boolean nullable;
	private boolean primary;
	private CleEtrangere cleEtrangere;

	/**
	 * Constructeur de la classe <code>Champ</code>.
	 * @throws SQLException
	 */
	public Champ(ResultSet pResultSet) throws SQLException {
		if (pResultSet != null) {
			nom = pResultSet.getString("COLUMN_NAME");
			type = pResultSet.getString("TYPE_NAME");
			valeurParDefaut = pResultSet.getString("COLUMN_DEF");
			commentaire = pResultSet.getString("REMARKS");
			position = pResultSet.getInt("ORDINAL_POSITION");
			taille = pResultSet.getInt("COLUMN_SIZE");
			nullable = pResultSet.getBoolean("NULLABLE");
			primary = false;
		}
	}

	/**
	 * <p><b>Accès en lecture à l'attribut nom.</b></p>
	 * @return Retourne l'attribut nom sous forme de <code>String</code>.
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut nom.</b></p>
	 * @param pNom L'attribut nom à modifier.
	 */
	public void setNom(String pNom) {
		nom = pNom;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut type.</b></p>
	 * @return Retourne l'attribut type sous forme de <code>String</code>.
	 */
	public String getType() {
		return type;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut type.</b></p>
	 * @param pType L'attribut type à modifier.
	 */
	public void setType(String pType) {
		type = pType;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut valeurParDefaut.</b></p>
	 * @return Retourne l'attribut valeurParDefaut sous forme de <code>String</code>.
	 */
	public String getValeurParDefaut() {
		return valeurParDefaut;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut valeurParDefaut.</b></p>
	 * @param pValeurParDefaut L'attribut valeurParDefaut à modifier.
	 */
	public void setValeurParDefaut(String pValeurParDefaut) {
		valeurParDefaut = pValeurParDefaut;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut commentaire.</b></p>
	 * @return Retourne l'attribut commentaire sous forme de <code>String</code>.
	 */
	public String getCommentaire() {
		return commentaire;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut commentaire.</b></p>
	 * @param pCommentaire L'attribut commentaire à modifier.
	 */
	public void setCommentaire(String pCommentaire) {
		commentaire = pCommentaire;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut position.</b></p>
	 * @return Retourne l'attribut position sous forme de <code>int</code>.
	 */
	public int getPosition() {
		return position;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut position.</b></p>
	 * @param pPosition L'attribut position à modifier.
	 */
	public void setPosition(int pPosition) {
		position = pPosition;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut taille.</b></p>
	 * @return Retourne l'attribut taille sous forme de <code>int</code>.
	 */
	public int getTaille() {
		return taille;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut taille.</b></p>
	 * @param pTaille L'attribut taille à modifier.
	 */
	public void setTaille(int pTaille) {
		taille = pTaille;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut nullable.</b></p>
	 * @return Retourne l'attribut nullable sous forme de <code>boolean</code>.
	 */
	public boolean isNullable() {
		return nullable;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut nullable.</b></p>
	 * @param pNullable L'attribut nullable à modifier.
	 */
	public void setNullable(boolean pNullable) {
		nullable = pNullable;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut primary.</b></p>
	 * @return Retourne l'attribut primary sous forme de <code>boolean</code>.
	 */
	public boolean isPrimary() {
		return primary;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut primary.</b></p>
	 * @param pPrimary L'attribut primary à modifier.
	 */
	public void setPrimary(boolean pPrimary) {
		primary = pPrimary;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut cleEtrangere.</b></p>
	 * @return Retourne l'attribut cleEtrangere sous forme de <code>CleEtrangere</code>.
	 */
	public CleEtrangere getCleEtrangere() {
		return cleEtrangere;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut cleEtrangere.</b></p>
	 * @param pCleEtrangere L'attribut cleEtrangere à modifier.
	 */
	public void setCleEtrangere(CleEtrangere pCleEtrangere) {
		cleEtrangere = pCleEtrangere;
	}

	/**
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Champ)) {
			return false;
		}
		Champ other = (Champ) obj;
		return new EqualsBuilder().append(nom, other.nom).isEquals();
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return new HashCodeBuilder(17, 37).append(nom).toHashCode();
	}

}
